package com.china.cnlongdb.server.datasync;

import java.util.Date;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.china.cnlongdb.basic.constant.ConcurrentDataMap;
import com.china.cnlongdb.basic.constant.LongDbConstant;
import com.china.cnlongdb.basic.entity.backups.LongdbBackupsEntity;
import com.china.cnlongdb.basic.entity.matchingrule.MatchingReadWrite;
import com.china.cnlongdb.server.config.LongdbConfigHandler;
import com.china.cnlongdb.server.connect.LongDbConnect;

/**
 * 系统名称：LongdbMasterSalveDataSync
 * 模块名称：
 × 模块描述：主从数据同步 - 管理类
 × 功能列表：
 × 模块作者：ZOUYONG
 × 开发时间：2018年12月25日 下午5:19:01
 × 模块路径：com.china.cnlongdb.server.datasync.LongdbMasterSalveDataSync
 */
public class LongdbMasterSalveDataSync {

	private static final Logger logger = (Logger) LoggerFactory.getLogger(LongdbMasterSalveDataSync.class);

	/**
	 * 功能描述：处理主从同步
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月25日 下午9:05:29
	 × 返回数据：void
	 */
	public static void masterSlaveSyncData(LongDbConnect connect, String operType, String methodName, Object... object) {
		if(!hasMasterSlaveSyncData(connect)) {
			return;
		}
		LongdbBackupsEntity backups = new LongdbBackupsEntity();
		backups.setOperType(operType);
		backups.setOperDate(new Date());
		backups.setMethodName(methodName);

		Class[] paramClas = new Class[object.length];
		for (int i=0; i<object.length; i++) {
			paramClas[i] = object[i].getClass();
		}
		backups.setParamClas(paramClas);
		backups.setParamObject(object);
		ConcurrentDataMap.longdbBackupsList.add(backups);
	}
	
	/**
	 * 功能描述：是否需要主从同步
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月25日 下午5:40:32
	 × 返回数据：boolean
	 */
	private static boolean hasMasterSlaveSyncData(LongDbConnect connect) {
		String masterSlaveName = Thread.currentThread().getName();
		if(StringUtils.isNotBlank(masterSlaveName) 
				&& masterSlaveName.endsWith(LongDbConstant.longdbMasterSlaveSynsFlag)) {
			return false;
		}
		// 获取备份机器列表
		List<MatchingReadWrite> matchingList = LongdbConfigHandler
				.getMatchingRuleListByConnect(connect, LongDbConstant.longdbSlaveDataBase);
		if(CollectionUtils.isEmpty(matchingList)) {
			return false;
		}
		return true;
	}

}
